home *** CD-ROM | disk | FTP | other *** search
/ PD ROM 1 / PD ROM Volume I - Macintosh Software from BMUG (1988).iso / Stacks / Updates⁄New / TEXAS for BMUG / C progs / TEXAS XFCNs ƒ / buildIndexXFCN ƒ / merge_indices.z1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-12-28  |  4.1 KB  |  126 lines  |  [TEXT/KAHL]

  1. /* mods 871211,22 for HyperCard XFCN work -- remove <stdio> stuff and
  2.  * go to the Mac toolbox and HC system ... ^z
  3.  */
  4.  
  5. /* file "merge_indices.c" ... by ^z -- 870823-...
  6.  * function to merge sorted indices together repeatedly until finished
  7.  * with them all in a single set of *.k/*.p files ...
  8.  *
  9.  * The merging strategy is straightforward enough:
  10.  *    Let "g" denote the generation_number and "f" denote the file_number.
  11.  *    Temporary file names begin with the letter z, which is then followed
  12.  *    by a generation number (decimal), the letter k or p (standing for
  13.  *    key or ptr, respectively), and then the file number (decimal).  Thus,
  14.  *    the file "z0k0" is the keys file #0 for generation #0 (the starting,
  15.  *    pre-merging, generation), file "z2p3" is the ptr file #3 for generation
  16.  *    #2, etc.
  17.  *
  18.  * (The following discussion is specifically for a 2-way merge ... but
  19.  * the generalization for N-way merging is straightforward.)
  20.  *
  21.  *    On a given call to merge_indices, the following may happen:
  22.  *        - files zgkf/zgpf and zgk(f+1)/zgp(f+1) are merged into files
  23.  *            z(g+1)k(f/2)/z(g+1)p(f/2), and then the parent files are
  24.  *            deleted;
  25.  *        - file zgkf isn't found, which means we are done with this
  26.  *            generation and must go on to the next;
  27.  *        - file zgk(f+1) isn't found, which means that either we are
  28.  *            completely done with the merging work (if f=0) and just
  29.  *            have to rename the files zgkf/zgpf into the correct final
  30.  *            names (that is, doc_filename.k/doc_filename.p), or else
  31.  *            (if f>0) we have an odd number of files for this level
  32.  *            of merging, and therefore just have to rename zgkf/zgpf
  33.  *            to z(g+1)k(f/2)/z(g+1)p(f/2).
  34.  */
  35.  
  36. /* modified 871224 to get rid of static variables used for generation_number
  37.  * and file_number ... instead, make the function return the upcoming
  38.  * generation_number, and let the caller reset the file_number to zero
  39.  * when the generation_number returned differs from the input number, or
  40.  * increment the file_number by NMERGE when still on same generation.
  41.  * Also, when all finished, return an illegal (negative) generation_number
  42.  * value.  ^z
  43.  */
  44.  
  45. #include "buildIndex.1.h"
  46.  
  47. int merge_indices (zbufsiz, doc_file, vRef0, file_number,
  48.                         generation_number, doc_filename)
  49.   long zbufsiz;
  50.   int doc_file, vRef0, file_number, generation_number;
  51.   Str255 doc_filename;
  52.   {
  53.     int ink[NMERGE], inp[NMERGE], outk, outp;
  54.     long inwords, indistinctwords, outdistinctwords;
  55.     int i, n;
  56.     char info[128];
  57.     
  58.     for (n = 0; n < NMERGE; ++n)
  59.       {
  60.         ink[n] = open_inkfile (file_number + n, vRef0, generation_number);
  61.         if (ink[n] == NULL)
  62.             break;
  63.         inp[n] = open_inpfile (file_number + n, vRef0, generation_number);
  64.       }
  65.     
  66.     if (file_number + n == 1)
  67.       {        
  68.         close_infiles (ink, inp, n);
  69.         fix_final_file_names (doc_filename, vRef0, generation_number);
  70.         return (-1);
  71.       }
  72.     
  73.     if (n < 2)
  74.       {
  75.         if (n == 1)
  76.           {
  77.             close_infiles (ink, inp, n);
  78.             fix_oddball_file_name (vRef0, generation_number, file_number);
  79.           }
  80.         strncpy (info + 1, "Beginning merge generation #", 28);
  81.         i = 29 + putNum (info + 29, 2 + generation_number);
  82.         info[0] = i - 1;
  83.         give_msg (info);
  84.         return (generation_number + 1);
  85.       }
  86.     
  87.     outk = open_outkfile (vRef0, generation_number, file_number);
  88.     outp = open_outpfile (vRef0, generation_number, file_number);
  89.     
  90.     inwords = 0;
  91.     indistinctwords = 0;
  92.     for (i = 0; i < n; ++i)
  93.       {
  94.         inwords += file_size (inp[i]) / sizeof(long);
  95.         indistinctwords += file_size (ink[i]) / sizeof(KEY_REC);
  96.       }
  97.     
  98.     nway_merge_kpfiles (ink, inp, outk, outp, n, zbufsiz);
  99.     
  100.     outdistinctwords = file_size (outk) / sizeof(KEY_REC);
  101.  
  102.     strncpy (info + 1, "Merge #", 7);
  103.     i = 8 + putNum (info + 8, 1 + file_number / NMERGE);
  104.     strncpy (info + i, ":  ", 3);
  105.     i += 3;
  106.     i += putNum (info + i, inwords);
  107.     strncpy (info + i, " total words, ", 14);
  108.     i += 14;
  109.     i += putNum (info + i, indistinctwords);
  110.     strncpy (info + i, " distinct words in, ", 20);
  111.     i += 20;
  112.     i += putNum (info + i, outdistinctwords);
  113.     strncpy (info + i, " out.", 5);
  114.     i += 5;
  115.     info[0] = i - 1;
  116.     give_msg (info);
  117.     
  118.     close_infiles (ink, inp, n);
  119.     FSClose (outk);
  120.     FSClose (outp);
  121.     remove_used_infiles (n, vRef0, generation_number, file_number);
  122.     
  123.     return (generation_number);
  124.   }
  125.  
  126.